<script>
  // 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。

  // 注意：答案中不可以包含重复的三元组。

  // **** 题源：leetcode 15

  // 输入：nums = [-1,0,1,2,-1,-4]
  // 输出：[[-1,-1,2],[-1,0,1]]

  /**
   * 分析
   *
   *
   */

  /**
   * @param {number[]} nums
   * @return {number[][]}
   */

  var nums = [-1, 0, 1, 2, -1, -4];

  var threeSum = function (nums) {
    let result = [];
    const len = nums.length;
    if (len < 3) return result;
    nums.sort((a, b) => a - b);

    for (let i = 0; i < nums.length - 2; i++) {
      // 排序过 如果大于0 说明不符合
      if (nums[i] > 0) break;
      // 去重
      if (i > 0 && nums[i] === nums[i - 1]) continue;
      let l = i + 1,
        r = len - 1;
      while (l < r) {
        const sum = nums[i] + nums[l] + nums[r];
        // 如果大于0
        if (sum > 0) {
          r--;
          continue;
        }
        // 如果小于0
        if (sum < 0) {
          l++;
          continue;
        }
        if (sum === 0) {
          result.push([nums[i], nums[l], nums[r]]);
          // 去重
          while (r > l && nums[r] === nums[--r]) r--;
          while (r > l && nums[l] === nums[++l]) l++;
          // 收缩指针
          r--;
          l++;
        }
      }
    }
    return result;
  };
  console.log(threeSum(nums));
</script>
